package cn.wolfcode.redis.impl;

import cn.wolfcode.domain.UserInfo;
import cn.wolfcode.exception.LogicException;
import cn.wolfcode.redis.IUserInfoRedisService;
import cn.wolfcode.redis.util.RedisKeysUtil;
import cn.wolfcode.util.AssertUtil;
import cn.wolfcode.util.JsonResult;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import jdk.nashorn.internal.parser.Token;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.stereotype.Service;
import org.springframework.web.client.RestTemplate;

import javax.annotation.Resource;
import java.util.UUID;
import java.util.concurrent.TimeUnit;

/**
 * @Description: redis业务逻辑实现类
 * @Author: 伍家钰
 * @Date: 2020/8/7 20:19
 * @Version: 1.0
 */
@Service
public class UserInfoRedisServiceImpl implements IUserInfoRedisService {
    @Resource
    private StringRedisTemplate stringRedisTemplate;

    @Override
    public void saveCode(String phone) {
        // 判断手机号是否为空如果是则报错
        AssertUtil.isEquals(phone, "手机号不能为空!");

        // 1.生成验证码
        String code = UUID.randomUUID().toString().replace("-", "").substring(0, 4);

        // 增强key的可读性
        String key = RedisKeysUtil.VERIFY_CODE.join(phone);

        // 编辑短信
       /* StringBuilder sb = new StringBuilder(80);

        // 拼接短信内容
        sb.append("【创信】你的验证码是:").append(code).append("请在5分钟内使用").append("工作人员不会索取,请勿泄露。");

        // 用于发送http请求
        RestTemplate template = new RestTemplate();

        // 短信发送的格式
        String url = "https://way.jd.com/chuangxin/dxjk?mobile={1}&content={2}&appkey={3}";

        *//*
         * 参数1:短信发送的url
         * 参数2:返回数据的格式
         * 参数3:发送的手机号码
         * 参数4:短信的内容
         * 参数5:短信的appkey
         *//*
        String result = template.getForObject(url, String.class, phone, sb.toString(),
                "727ae7ef85e1de40e6ff9e9b49f0212c");
        // 打印发送短信返回的信息
        System.out.println(result + "======================================");

        *//*
         * 判断返回的信息中是否包含Success字符串:
         *  true:发送成功 ; false:发送失败
         *//*
        if (!(result.contains("Success"))) {
            throw new LogicException("短信发送失败");
        }*/

        // 保存验证码对并设置过期时间
        stringRedisTemplate.opsForValue().set(key, code, RedisKeysUtil.VERIFY_CODE.getTime(), TimeUnit.SECONDS);
    }

    @Override
    public String getCodeByPhone(String phone) {
        // 增强key的可读性
        String key = RedisKeysUtil.VERIFY_CODE.join(phone);
        return stringRedisTemplate.opsForValue().get(key);
    }

    @Override
    public String saveToken(UserInfo userInfo) {
        // 3.通过UUID生成登入令牌(要求随机唯一)
        String token = UUID.randomUUID().toString().replace("-", "");
        String newToken = RedisKeysUtil.LOGIN_TOKEN.join(token);
        // 4.以token作为key,user对象作为value存入到redis缓存中,并且设置token有效时间为30分钟
        String user = JSON.toJSONString(userInfo);
        stringRedisTemplate.opsForValue().set(newToken, user, RedisKeysUtil.LOGIN_TOKEN.getTime(),
                TimeUnit.SECONDS);
        return token;
    }

    @Override
    public UserInfo getByToken(String token) {
        // 判断token是否为空
        if (token == null) {
            return null;
        }

        // 将token的值加前缀
        String key = RedisKeysUtil.LOGIN_TOKEN.join(token);

        // 判断key是否失效
        if (stringRedisTemplate.hasKey(key)) {
            // 根据key来取value值
            String user = stringRedisTemplate.opsForValue().get(key);
            UserInfo userInfo = JSON.parseObject(user, UserInfo.class);
            // 延长token的有效时间
            stringRedisTemplate.expire("token", RedisKeysUtil.LOGIN_TOKEN.getTime(), TimeUnit.SECONDS);
            return userInfo;
        }
        return null;
    }


}
